暑期来啦~⼀起看⼀看近期的天⽓情况
本文作者:孟 孔 中南财经政法大学金融学院
本文编辑:何 疆
技术总编:温和铭
Stata and Python 数据分析
爬虫俱乐部将于2023年8月1日至9日在河南大学(河南开封)举行Stata编程技术和Python编程技术定制培训,同时在网络平台进行直播,提供线上学习的方式。线上线下培训均有专门的答疑团队。大家感兴趣请点击推文链接《爬虫俱乐部2023第一期编程训练营开始报名啦!》或点击文末阅读原文查看课程详情及报名方式!
一、引言
酷暑天⽓频频到来~⼤家还会时刻盯着19:30新闻联播结束后的天⽓预报吗?快来跟着作者,⼀起爬取天⽓数据吧!本文使⽤Python和Stata进⾏数据爬取与处理,为您处理数据打开新思路!
二、爬取城市列表
我们选择中国天⽓⽹的数据(http://www.weather.com.cn/textFC/hb.shtml)作为数据来源。
我们通过华北、东北、华中、华南、⻄北、⻄南等选项,爬取城市链接。采⽤requests⽅式,借助Xpath⼯具提取链接,同时使⽤Pystata对数据进⾏清理。
import requests #导入requests模块
import pandas as pd #导入pandas模块
from lxml import etree
#设置爬取的空列表
city_url = []
#爬取地级市/直辖市区列表
geographic_orientation = ['hb','db','hd','hz','hn','xb','xn']
for url_ori in geographic_orientation:
url = 'http://www.weather.com.cn/textFC/' + url_ori + '.shtml'
response = requests.get(url)
print(url)
response.encoding = 'utf-8'
html = etree.HTML(response.text)
c_url = html.xpath("//*/a/@href")
city_url.append(c_url)df = pd.DataFrame()
df['city_url'] = city_url
df.to_csv("城市url.csv",encoding='utf_8_sig')
Stata清洗数据具有极⼤优势,且语法简单、操作⽅便,深受科研⼈⼠喜爱!本文使⽤PyStata在Python内运⾏Stata代码。关于Python与Stata交互内容详情,查看俱乐部历史文章~好好学习!
from pystata import config
#调⽤pystata⾼效清洗数据
stata.run('''
clear all
import delimited "C:\Users\XM\Desktop\暑期来啦~⼀起看⼀看近期的天⽓情况\代码\stata处
理过程\城市url.csv", varnames(1) clear
forvalues i=0(1)6{
import delimited "C:\Users\XM\Desktop\暑期来啦~⼀起看⼀看近期的天⽓情况\代码
\stata处理过程\城市url.csv", varnames(1) clear
keep if v1 == `i'
split city_url,p(",")
drop v1 city_url
sxpose, clear
gen city_url_ture = ustrregexs(1) if
ustrregexm(_var1,"'http://www.weather.com.cn/weather/(.*?).shtml'")
gen var222 = "http://www.weather.com.cn/weather/"
gen var333 = ".shtml"
gen url = var222 + city_url_ture + var333
drop if city_url_ture == ""
drop _var1 city_url_ture var222 var333
duplicates drop
save "C:\Users\XM\Desktop\暑期来啦~⼀起看⼀看近期的天⽓情况\代码\stata处理过程
\url+`i'.dta",replace
}
clear
cd C:\Users\XM\Desktop\暑期来啦~⼀起看⼀看近期的天⽓情况\代码
local files: dir "." file "*.dta"
foreach file in `files'{
append using `file', force
}
duplicates drop
export delimited using "C:\Users\XM\Desktop\暑期来啦~⼀起看⼀看近期的天⽓情况\代码
\stata处理过程\所有城市url.csv", novarnames replace
'''
)
城市列表最终爬取结果如下所⽰:
三、爬取城市七日天气预报
Xpath定位,爬取城市的名称、⽇期、最⾼温、最低温、⻛速、天⽓等信息。
import requests #导入requests模块
import pandas as pd #导入pandas模块
from lxml import etree
#设置爬取的空列表
province = []
city = []
city2 = []
city3 = []
day = []
weather = []
temp_high = []
temp_low = []
win = []
#读取上⼀步csv的地级市url
df = pd.read_csv(r'C:\Users\XM\Desktop\暑期来啦~⼀起看⼀看近期的天⽓情况\代码\stata处
理过程\所有城市url.csv')
url_list = []
url_list_all = df.values.tolist()
for url_li in url_list_all:
url_list.append(url_li[0])
for url in url_list:
# requests解析⽹⻚
response = requests.get(url)
response.encoding = 'utf-8'
html = etree.HTML(response.text)
#xpath提取
for i in range(1,8,1):
prov =
html.xpath('/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/a[2]/text()')
province.append(prov)
cit1 =
html.xpath('/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/a[3]/text()')
city.append(cit1)
cit2 =
html.xpath('/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/span[3]/text()')
city2.append(cit2)
cit3 =
html.xpath('/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/span[4]/text()')
city3.append(cit3)
days = html.xpath(('//*[@id="7d"]/ul/li[{}]/h1/text()').format(i))
day.append(days)
wea = html.xpath(('//*[@id="7d"]/ul/li[{}]/p[1]/text()').format(i))
weather.append(wea)
temp_h = html.xpath(('//*
[@id="7d"]/ul/li[{}]/p[2]/span/text()').format(i))
temp_high.append(temp_h)
temp_l = html.xpath(('//*[@id="7d"]/ul/li[{}]/p[2]/i/text()').format(i))
temp_low.append(temp_l)
wi = html.xpath(('//*[@id="7d"]/ul/li[{}]/p[3]/i/text()').format(i))
win.append(wi)
#保存csv
df = pd.DataFrame()
df['province'] = province
df['city'] = city
df['city2'] = city2
df['city3'] = city3
df['day'] = day
df['weather'] = weather
df['temp_high'] = temp_high
df['temp_low'] = temp_low
df['win'] = win
df.to_csv("7days天⽓预报.csv",encoding='utf_8_sig')
因为城市名称容易出现偏误,我们继续使⽤Pystata处理城市名称~
from pystata import config
#调⽤pystata⾼效清洗数据
stata.run('''
clear all
import delimited "C:\Users\XM\Desktop\暑期来啦~⼀起看⼀看近期的天⽓情况\代码\7days天
⽓预报.csv", varnames(1)
replace city = "" if city == "[]"
replace city = city2 if city == ""
replace city2 = "" if city2 == "['>']"
replace city2 = city3 if city2 == ""
drop city3
save C:\Users\XM\Desktop\暑期来啦~⼀起看⼀看近期的天⽓情况\代码\stata处理过程2\7days天
⽓预报.dta,replace
''')
最终爬取结果如下所⽰:
快来试⼀试~爬取感兴趣的地⽅的天⽓预报,根据天⽓状况,更好地规划出⾏,祝您暑期愉快!
END
重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐【命令重磅更新】在Stata中深入使用ChatGPT
爬虫俱乐部2023第一期编程训练营开始报名啦!
【爬虫基础】Scrapy爬虫框架
迈向交互式编程,ChatGPT更新!一个简单又好玩的Python库——MyQR
replace命令的“加强版”!——如何使用ereplace,结合egen
XML 轻松读取:用 Python 发现数据宝藏
爬虫俱乐部重磅推出cnstata.com.cn
Markdown:让数学公式输入更方便!
处理日期的好手:pendulumWhat’ new ? 速通Stata 18
【爬虫实战】Python爬取美食菜谱揭秘网络中心人物,你会是其中之一吗?考研之后,文科生需以“do”躬“do”!焕新升级!轻松获取港股、权证的历史交易数据爬虫俱乐部的精彩答疑---cntraveltime【爬虫俱乐部新命令速递】在Stata中与ChatGPT对话 关于我们微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。